<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Skilful: Исходный файл Skilful/Data/DataSourceLibraries/dukas/dukascopylib.cs</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javaScript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Создано системой Doxygen 1.7.1 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Поиск');
--></script>
<div class="navigation" id="top">
  <div class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Титульная&nbsp;страница</span></a></li>
      <li><a href="namespaces.html"><span>Пакеты</span></a></li>
      <li><a href="annotated.html"><span>Классы</span></a></li>
      <li class="current"><a href="files.html"><span>Файлы</span></a></li>
      <li><a href="dirs.html"><span>Алфавитный&nbsp;указатель&nbsp;директорий</span></a></li>
      <li id="searchli">
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Поиск" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>Файлы</span></a></li>
    </ul>
  </div>
  <div class="navpath">
    <ul>
      <li><a class="el" href="dir_7adcdc1edff7620168fbc20357cad448.html">Skilful</a>      </li>
      <li><a class="el" href="dir_c777626736fbbff11bce263deda591b3.html">Data</a>      </li>
      <li><a class="el" href="dir_647839cbd444298f9ebd82118acdfd67.html">DataSourceLibraries</a>      </li>
      <li><a class="el" href="dir_d47459a9ff31d96104dbcb8c1ea28ce7.html">dukas</a>      </li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<h1>dukascopylib.cs</h1>  </div>
</div>
<div class="contents">
<a href="dukascopylib_8cs.html">См. документацию.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 ﻿<span class="comment">//---------------------------------------------------------------------------------------------------------------</span>
<a name="l00002"></a>00002 <span class="comment">// Skilful. Tactica Adversa graphic and analysis tool.</span>
<a name="l00003"></a>00003 <span class="comment">// Copyright (C) 2010 &quot;...&quot;, Andrey Zyablitsev (skat)</span>
<a name="l00004"></a>00004 <span class="comment">//</span>
<a name="l00005"></a>00005 <span class="comment">// This program is free software; you can redistribute it and/or</span>
<a name="l00006"></a>00006 <span class="comment">// modify it under the terms of the GNU General Public License</span>
<a name="l00007"></a>00007 <span class="comment">// as published by the Free Software Foundation; either version 2</span>
<a name="l00008"></a>00008 <span class="comment">// of the License, or (at your option) any later version.</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">// This program is distributed in the hope that it will be useful,</span>
<a name="l00011"></a>00011 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00012"></a>00012 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00013"></a>00013 <span class="comment">// GNU General Public License for more details.</span>
<a name="l00014"></a>00014 <span class="comment">//</span>
<a name="l00015"></a>00015 <span class="comment">// You should have received a copy of the GNU General Public License</span>
<a name="l00016"></a>00016 <span class="comment">// along with this program; if not, write to the Free Software</span>
<a name="l00017"></a>00017 <span class="comment">// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span>
<a name="l00018"></a>00018 <span class="comment">//</span>
<a name="l00019"></a>00019 <span class="comment">// mail: support@protoforma.com </span>
<a name="l00020"></a>00020 <span class="comment">//---------------------------------------------------------------------------------------------------------------</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="keyword">using</span> System;
<a name="l00024"></a>00024 <span class="keyword">using</span> System.IO;
<a name="l00025"></a>00025 <span class="keyword">using</span> System.Collections;
<a name="l00026"></a>00026 <span class="keyword">using</span> System.Collections.Generic;
<a name="l00027"></a>00027 <span class="keyword">using</span> System.Text;
<a name="l00028"></a>00028 <span class="comment">//using System.Windows;</span>
<a name="l00029"></a>00029 <span class="keyword">using</span> System.Reflection;
<a name="l00030"></a>00030 <span class="keyword">using</span> System.Threading;
<a name="l00031"></a>00031 <span class="keyword">using</span> System.ComponentModel;
<a name="l00032"></a>00032 <span class="keyword">using</span> Microsoft.Win32;
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 <span class="keyword">namespace </span>Skilful.Data
<a name="l00035"></a>00035 {
<a name="l00036"></a><a class="code" href="namespace_skilful_1_1_data.html#a8184817815af475bdb725292d9eb7c51">00036</a>     <span class="keyword">enum</span> <a class="code" href="namespace_skilful_1_1_data.html#a8184817815af475bdb725292d9eb7c51">LoginType</a> { SelectFile, SelectFolder, SetIPLoginPassword, UserDefined }
<a name="l00037"></a>00037     <span class="comment">//public delegate void frcvr(string SourceName, string SymbolName, DateTime time, double tick);</span>
<a name="l00038"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html">00038</a>     <span class="keyword">public</span> <span class="keyword">class </span><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html">DataSourceClass</a>
<a name="l00039"></a>00039     {
<a name="l00040"></a>00040         <span class="keyword">const</span> <span class="keywordtype">string</span> ModuleName = <span class="stringliteral">&quot;Dukascopy&quot;</span>;
<a name="l00041"></a>00041         <span class="keyword">static</span> MethodInfo libmsgreceiver;
<a name="l00042"></a>00042         <span class="keyword">static</span> StreamWriter sw = null;
<a name="l00043"></a>00043         <span class="keyword">static</span> <span class="keywordtype">bool</span> dbg = <span class="keyword">false</span>;
<a name="l00044"></a>00044 
<a name="l00045"></a>00045         <span class="comment">//загрузка информации о модуле</span>
<a name="l00046"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a39ecd4f9e2b7604d6fae72f08b0c842a">00046</a>         <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> init(<span class="keywordtype">char</span>[] module_name, <span class="keywordtype">char</span>[] prompt, <span class="keywordtype">char</span>[] description, <span class="keywordtype">int</span>[] login_type)
<a name="l00047"></a>00047         {
<a name="l00048"></a>00048             strcpy(ModuleName, module_name);
<a name="l00049"></a>00049             strcpy(<span class="stringliteral">&quot;Please enter URL, Login and Password&quot;</span>, prompt);
<a name="l00050"></a>00050             
<a name="l00051"></a>00051             <span class="comment">//using this string as file mask</span>
<a name="l00052"></a>00052             strcpy(<span class="stringliteral">&quot;Server Address=https://www.dukascopy.com/client/demo/jclient/jforex.jnlp, Login=, Passwrd=&quot;</span>, description);
<a name="l00053"></a>00053             login_type[0] = (int)<a class="code" href="namespace_skilful_1_1_data.html#a8184817815af475bdb725292d9eb7c51">LoginType</a>.UserDefined;
<a name="l00054"></a>00054 
<a name="l00055"></a>00055             <span class="comment">//функция передачи сообщений в вызывающую программу</span>
<a name="l00056"></a>00056             libmsgreceiver = Assembly.LoadFrom(<span class="stringliteral">&quot;Skilful.exe&quot;</span>).GetType(<span class="stringliteral">&quot;Skilful.QuotesManager.MDataManager&quot;</span>).GetMethod(<span class="stringliteral">&quot;LibMsgReciever&quot;</span>);
<a name="l00057"></a>00057 
<a name="l00058"></a>00058             <span class="comment">//true to append to existing or create new, false to overwrite existing or create new</span>
<a name="l00059"></a>00059             <span class="keywordflow">if</span> (dbg)
<a name="l00060"></a>00060             {
<a name="l00061"></a>00061                 sw = <span class="keyword">new</span> StreamWriter(<span class="stringliteral">&quot;dukas.log&quot;</span>);
<a name="l00062"></a>00062                 sw.AutoFlush = <span class="keyword">true</span>; <span class="comment">//будет сразу в файл сбрасывать, не буферизуя</span>
<a name="l00063"></a>00063             }
<a name="l00064"></a>00064         }
<a name="l00065"></a>00065 
<a name="l00066"></a>00066         <span class="comment">//преобразование строки содержащей значение типа double в число double</span>
<a name="l00067"></a>00067         <span class="keyword">static</span> <span class="keywordtype">double</span> a2f(<span class="keywordtype">string</span> s)
<a name="l00068"></a>00068         {
<a name="l00069"></a>00069             <span class="keywordtype">string</span>[] dbl = s.Split(<span class="charliteral">&#39;,&#39;</span>,<span class="charliteral">&#39;;&#39;</span>,<span class="charliteral">&#39;.&#39;</span>);
<a name="l00070"></a>00070             <span class="keywordtype">double</span> val= <span class="keywordtype">int</span>.Parse(dbl[0]);
<a name="l00071"></a>00071             <span class="keywordflow">if</span> (dbl[1].Length &gt; 4) dbl[1] = dbl[1].Substring(0, 4);
<a name="l00072"></a>00072             <span class="keywordflow">if</span> (dbl.Length == 2) val += <span class="keywordtype">int</span>.Parse(dbl[1]) / Math.Pow(10, dbl[1].Length);
<a name="l00073"></a>00073             <span class="keywordflow">return</span> val;
<a name="l00074"></a>00074         }
<a name="l00075"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#af8a1cf3a03f1a5a2fd7e138acc3e977b">00075</a>         <span class="keyword">public</span> <span class="keyword">enum</span> <a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#af8a1cf3a03f1a5a2fd7e138acc3e977b">colname</a> { ticker, date, time, open, high, low, close, count };
<a name="l00076"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a241fc9d8f089b9cf41d18ac8bc9294f1">00076</a>         <span class="keyword">public</span> <span class="keyword">enum</span> <a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a241fc9d8f089b9cf41d18ac8bc9294f1">Q</a> { T, O, H, L, C };
<a name="l00077"></a>00077         <span class="keyword">const</span> <span class="keywordtype">int</span> T = (int)Q.T, O = (<span class="keywordtype">int</span>)Q.O, H = (int)Q.H, L = (<span class="keywordtype">int</span>)Q.L, C = (int)Q.C;
<a name="l00078"></a>00078         
<a name="l00079"></a>00079         <span class="comment">//путь по умолчанию для локальной БД</span>
<a name="l00080"></a>00080         <span class="keyword">static</span> <span class="keywordtype">string</span> StoragePath = <span class="stringliteral">&quot;Dukascopy&quot;</span>;
<a name="l00081"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a2976386ad56013c462530e23408bd7f1">00081</a>         <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> storagePath(<span class="keywordtype">char</span>[] path)
<a name="l00082"></a>00082         {
<a name="l00083"></a>00083             <span class="keywordflow">if</span> (path[0] == <span class="charliteral">&#39;\0&#39;</span>) <span class="comment">//get</span>
<a name="l00084"></a>00084             {
<a name="l00085"></a>00085                 strcpy(StoragePath, path);
<a name="l00086"></a>00086             }
<a name="l00087"></a>00087             <span class="keywordflow">else</span> <span class="comment">//set</span>
<a name="l00088"></a>00088             {
<a name="l00089"></a>00089                 StoragePath = <span class="keyword">new</span> string(path, 0, path.Length);
<a name="l00090"></a>00090             }
<a name="l00091"></a>00091         }
<a name="l00093"></a>00093         MethodInfo ticksreceiver, barsreceiver;
<a name="l00094"></a>00094         BackgroundWorker bglistener;
<a name="l00095"></a>00095         Dictionary&lt;string, double[]&gt; quotes = <span class="keyword">new</span> Dictionary&lt;string, double[]&gt;();
<a name="l00096"></a>00096         Dictionary&lt;string, int&gt; gi = <span class="keyword">new</span> Dictionary&lt;string, int&gt;(); <span class="comment">//global int i=0; foreach SYMBOL+TF</span>
<a name="l00097"></a>00097         Dictionary&lt;string, int&gt; history_filled = <span class="keyword">new</span> Dictionary&lt;string, int&gt;(); <span class="comment">//0=no; 1=filled BID or ASK; 2=filled all</span>
<a name="l00098"></a>00098         Dictionary&lt;string, bool&gt; subscribed_symbols = <span class="keyword">new</span> Dictionary&lt;string, bool&gt;();
<a name="l00099"></a>00099 
<a name="l00100"></a>00100         <span class="keywordtype">bool</span> connected;
<a name="l00101"></a>00101 
<a name="l00102"></a>00102         System.Diagnostics.Process JFClient_lst;
<a name="l00103"></a>00103         <span class="keyword">static</span> <span class="keywordtype">string</span> folder_path;
<a name="l00104"></a>00104         <span class="comment">//frcvr rcvr;</span>
<a name="l00105"></a>00105         <span class="keywordtype">void</span> onConnect()
<a name="l00106"></a>00106         {
<a name="l00107"></a>00107             connected = <span class="keyword">true</span>;
<a name="l00108"></a>00108         }
<a name="l00109"></a>00109         <span class="keywordtype">void</span> onStop()
<a name="l00110"></a>00110         {
<a name="l00111"></a>00111             <span class="comment">//bglistener.CancelAsync();</span>
<a name="l00112"></a>00112             <span class="keywordflow">if</span> (JFClient_lst != null)
<a name="l00113"></a>00113             {
<a name="l00114"></a>00114                 JFClient_lst.Dispose();
<a name="l00115"></a>00115                 JFClient_lst = null;
<a name="l00116"></a>00116             }
<a name="l00117"></a>00117             bglistener = null;
<a name="l00118"></a>00118             connected = <span class="keyword">false</span>;
<a name="l00119"></a>00119             <span class="comment">//subscribed_symbols.Clear();</span>
<a name="l00120"></a>00120         }
<a name="l00121"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a113aeeb30a2d4e1979358f1b31ca343e">00121</a>         <span class="keyword">public</span> <span class="keywordtype">void</span> SetTickHandler(<span class="keywordtype">string</span> sym)
<a name="l00122"></a>00122         {
<a name="l00123"></a>00123             <span class="keywordflow">if</span> (JFClient_lst != null &amp;&amp; JFClient_lst.HasExited)
<a name="l00124"></a>00124             {
<a name="l00125"></a>00125                 <span class="comment">// SendMessage(JFClient_lst);</span>
<a name="l00126"></a>00126                 onStop(); <span class="comment">//JFClient_lst.Dispose(); JFClient_lst = null; bglistener = null; connected = false;</span>
<a name="l00127"></a>00127             }
<a name="l00128"></a>00128             <span class="keywordflow">if</span> (bglistener == null) <span class="comment">//bglistener не активирован либо остановлен</span>
<a name="l00129"></a>00129             {
<a name="l00130"></a>00130                 <span class="keywordflow">try</span>
<a name="l00131"></a>00131                 {
<a name="l00132"></a>00132                     ticksreceiver = Assembly.LoadFrom(<span class="stringliteral">&quot;Skilful.exe&quot;</span>).GetType(<span class="stringliteral">&quot;Skilful.QuotesManager.MDataManager&quot;</span>).GetMethod(<span class="stringliteral">&quot;RecieveNewTick&quot;</span>);
<a name="l00133"></a>00133                     barsreceiver = Assembly.LoadFrom(<span class="stringliteral">&quot;Skilful.exe&quot;</span>).GetType(<span class="stringliteral">&quot;Skilful.QuotesManager.MDataManager&quot;</span>).GetMethod(<span class="stringliteral">&quot;RecieveNewBar&quot;</span>);
<a name="l00134"></a>00134                     bglistener = <span class="keyword">new</span> BackgroundWorker();
<a name="l00135"></a>00135                     bglistener.WorkerSupportsCancellation = <span class="keyword">true</span>;
<a name="l00136"></a>00136                     bglistener.DoWork += ticks_listener;
<a name="l00137"></a>00137                     bglistener.RunWorkerCompleted += ticks_listener_completed;
<a name="l00138"></a>00138                     bglistener.RunWorkerAsync(sym);
<a name="l00139"></a>00139                     subscribed_symbols[sym] = <span class="keyword">true</span>;
<a name="l00140"></a>00140                     <span class="keywordflow">if</span> (subscribed_symbols.Count &gt; 1)
<a name="l00141"></a>00141                     {
<a name="l00142"></a>00142                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cnt = 100; !connected &amp;&amp; (cnt &gt; 0); cnt--) Thread.Sleep(100); <span class="comment">//wait 10 seconds</span>
<a name="l00143"></a>00143                         <span class="keywordflow">if</span> (connected)
<a name="l00144"></a>00144                           <span class="keywordflow">foreach</span> (<span class="keywordtype">string</span> key <span class="keywordflow">in</span> subscribed_symbols.Keys)
<a name="l00145"></a>00145                             <span class="keywordflow">if</span> (key != sym)
<a name="l00146"></a>00146                                 JFClient_lst.StandardInput.WriteLine(<span class="stringliteral">&quot;add_symbol &quot;</span> + sym);
<a name="l00147"></a>00147                     }
<a name="l00148"></a>00148                 }
<a name="l00149"></a>00149                 <span class="keywordflow">catch</span> (Exception e)
<a name="l00150"></a>00150                 {
<a name="l00151"></a>00151                     Console.WriteLine(<span class="stringliteral">&quot;dukascopy.SetTickHandler: can not load Skilful.exe&quot;</span>);
<a name="l00152"></a>00152                     SendMessage(e.Message + <span class="stringliteral">&quot;(SetTickHandler)&quot;</span>);
<a name="l00153"></a>00153                 }
<a name="l00154"></a>00154             }
<a name="l00155"></a>00155             <span class="keywordflow">else</span> <span class="comment">//bglistener уже запущен, подпишемся на новый инструмент</span>
<a name="l00156"></a>00156             {
<a name="l00157"></a>00157                 <span class="keywordtype">int</span> cnt = 100; <span class="comment">//wait 10 seconds</span>
<a name="l00158"></a>00158                 <span class="keywordflow">while</span> (!connected &amp;&amp; (cnt-- &gt; 0) &amp;&amp; JFClient_lst != null &amp;&amp; !JFClient_lst.HasExited) Thread.Sleep(100);
<a name="l00159"></a>00159                 <span class="keywordflow">try</span>
<a name="l00160"></a>00160                 {
<a name="l00161"></a>00161                     <span class="keywordflow">if</span> (JFClient_lst == null || JFClient_lst.HasExited || !connected)
<a name="l00162"></a>00162                     {
<a name="l00163"></a>00163                         SendMessage(JFClient_lst);
<a name="l00164"></a>00164                         onStop();  <span class="comment">//JFClient_lst.Dispose(); JFClient_lst = null; bglistener = null; connected = false;</span>
<a name="l00165"></a>00165                         <span class="keywordflow">return</span>;
<a name="l00166"></a>00166                     }
<a name="l00167"></a>00167 
<a name="l00168"></a>00168                     JFClient_lst.StandardInput.WriteLine(<span class="stringliteral">&quot;add_symbol &quot;</span> + sym);
<a name="l00169"></a>00169                     subscribed_symbols[sym] = <span class="keyword">true</span>;
<a name="l00170"></a>00170                     <span class="keywordflow">if</span>(dbg)sw.WriteLine(<span class="stringliteral">&quot;Send: add_symbol &quot;</span> + sym);
<a name="l00171"></a>00171                 }
<a name="l00172"></a>00172                 <span class="keywordflow">catch</span> (Exception e)
<a name="l00173"></a>00173                 {
<a name="l00174"></a>00174                     SendMessage(e.Message + <span class="stringliteral">&quot;(SetTickHandler)2&quot;</span>);
<a name="l00175"></a>00175                 }
<a name="l00176"></a>00176             }
<a name="l00177"></a>00177         }
<a name="l00178"></a>00178 
<a name="l00179"></a>00179         <span class="comment">//-------------------------------------//</span>
<a name="l00180"></a>00180         <span class="keywordtype">void</span> ticks_listener(<span class="keywordtype">object</span> sender, DoWorkEventArgs e)
<a name="l00181"></a>00181         {
<a name="l00182"></a>00182             <span class="keywordflow">if</span> (ticksreceiver != null)
<a name="l00183"></a>00183             {
<a name="l00184"></a>00184                 <span class="keywordtype">string</span>[] param = folder_path.Split(<span class="charliteral">&#39;,&#39;</span>);
<a name="l00185"></a>00185                 <span class="keywordtype">char</span> delim = <span class="charliteral">&#39;=&#39;</span>;
<a name="l00186"></a>00186                 <span class="keywordtype">string</span> server_url = param[0].Substring(param[0].IndexOf(delim) + 1);
<a name="l00187"></a>00187                 <span class="keywordtype">string</span> login = param[1].Substring(param[1].IndexOf(delim) + 1);
<a name="l00188"></a>00188                 <span class="keywordtype">string</span> password = param[2].Substring(param[2].IndexOf(delim) + 1);
<a name="l00189"></a>00189 
<a name="l00190"></a>00190                 <span class="keywordtype">string</span> sym = (string)e.Argument;
<a name="l00191"></a>00191                 JFClient_lst = <span class="keyword">new</span> System.Diagnostics.Process();
<a name="l00192"></a>00192                 JFClient_lst.StartInfo.FileName = <span class="stringliteral">&quot;java&quot;</span>;
<a name="l00193"></a>00193                 JFClient_lst.StartInfo.Arguments = <span class="stringliteral">&quot;-jar JFClient.jar &quot;</span> + <span class="stringliteral">&quot;listen &quot;</span> + server_url + <span class="stringliteral">&quot; &quot;</span> + login + <span class="stringliteral">&quot; &quot;</span> + password + <span class="stringliteral">&quot; &quot;</span> + sym + <span class="stringliteral">&quot; 0 0 0 0&quot;</span>;
<a name="l00194"></a>00194 <span class="comment">//                JFClient_lst.StartInfo.Arguments = &quot;-jar JFClient0.jar &quot; + &quot;listen &quot; + server_url + &quot; &quot; + login + &quot; &quot; + password + &quot; &quot; + sym + &quot; &quot; + tf2ms((TF)current_frame) + &quot; &quot; + 1000 + &quot; 0 0&quot;;</span>
<a name="l00195"></a>00195                 JFClient_lst.StartInfo.UseShellExecute = <span class="keyword">false</span>;
<a name="l00196"></a>00196                 JFClient_lst.StartInfo.RedirectStandardOutput = <span class="keyword">true</span>;
<a name="l00197"></a>00197                 JFClient_lst.StartInfo.RedirectStandardInput = <span class="keyword">true</span>;
<a name="l00198"></a>00198                 <span class="comment">//JFClient_lst.StartInfo.RedirectStandardError = true;</span>
<a name="l00199"></a>00199                 JFClient_lst.StartInfo.CreateNoWindow = <span class="keyword">true</span>;
<a name="l00200"></a>00200                 <span class="keywordflow">try</span>
<a name="l00201"></a>00201                 {
<a name="l00202"></a>00202                     JFClient_lst.Start(); <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="keywordtype">string</span>.Format(<span class="stringliteral">&quot;{0:yyyy-MM-dd HH:mm:ss.fff}: {1}&quot;</span>, DateTime.Now, <span class="stringliteral">&quot;java -jar JFClient.jar &quot;</span> + <span class="stringliteral">&quot;listen &quot;</span> + server_url + <span class="stringliteral">&quot; &quot;</span> + login + <span class="stringliteral">&quot; &quot;</span> + password + <span class="stringliteral">&quot; &quot;</span> + sym + <span class="stringliteral">&quot; &quot;</span> + tf2ms(<a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.m60) + <span class="stringliteral">&quot; 0 0 0&quot;</span>));
<a name="l00203"></a>00203                 }
<a name="l00204"></a>00204                 <span class="keywordflow">catch</span>(Exception ex)
<a name="l00205"></a>00205                 {
<a name="l00206"></a>00206                     SendMessage(<span class="stringliteral">&quot;Can`t execute JFClient_lst.Start(&quot;</span> + JFClient_lst.StartInfo.FileName + <span class="stringliteral">&quot; &quot;</span> + JFClient_lst.StartInfo.Arguments+<span class="stringliteral">&quot;)&quot;</span> + ex.Message);
<a name="l00207"></a>00207                     JFClient_lst = null;
<a name="l00208"></a>00208                     <span class="keywordflow">return</span>;
<a name="l00209"></a>00209                 }
<a name="l00210"></a>00210 
<a name="l00211"></a>00211                 <span class="keywordflow">if</span> (JFClient_lst != null &amp;&amp; JFClient_lst.HasExited)
<a name="l00212"></a>00212                 {
<a name="l00213"></a>00213                     <span class="comment">//SendMessage(JFClient_lst);</span>
<a name="l00214"></a>00214                     JFClient_lst.Dispose();
<a name="l00215"></a>00215                     JFClient_lst = null;
<a name="l00216"></a>00216                     <span class="keywordflow">return</span>;
<a name="l00217"></a>00217                 }
<a name="l00218"></a>00218 
<a name="l00219"></a>00219                 <span class="keywordtype">string</span> input, log = <span class="stringliteral">&quot;ticks_listener&quot;</span>;
<a name="l00220"></a>00220                 <span class="keywordflow">while</span> ((input = JFClient_lst.StandardOutput.ReadLine()) != null)
<a name="l00221"></a>00221                 {
<a name="l00222"></a>00222                     <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="stringliteral">&quot;Rcv: &quot;</span> + input);
<a name="l00223"></a>00223                     <span class="comment">//if (input.IndexOf(&quot;no protocol:&quot;) &gt;= 0)</span>
<a name="l00224"></a>00224                     <span class="comment">//{</span>
<a name="l00225"></a>00225                     <span class="comment">//    SendMessage(input);</span>
<a name="l00226"></a>00226                     <span class="comment">//    return; //network not found</span>
<a name="l00227"></a>00227                     <span class="comment">//}</span>
<a name="l00228"></a>00228                     <span class="keywordflow">if</span> (input.IndexOf(<span class="stringliteral">&quot;&amp;on&quot;</span>) != 0)
<a name="l00229"></a>00229                     {
<a name="l00230"></a>00230                         log += <span class="stringliteral">&quot;\n&quot;</span> + input;
<a name="l00231"></a>00231                         <span class="keywordflow">continue</span>;
<a name="l00232"></a>00232                     }
<a name="l00233"></a>00233 
<a name="l00234"></a>00234 
<a name="l00235"></a>00235                     <span class="keywordtype">string</span>[] vals = input.Split(<span class="charliteral">&#39; &#39;</span>);
<a name="l00236"></a>00236                     <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onTick:&quot;</span>)
<a name="l00237"></a>00237                     {
<a name="l00238"></a>00238                         DateTime time = <span class="keyword">new</span> DateTime(1970, 01, 01) + TimeSpan.FromMilliseconds(<span class="keywordtype">double</span>.Parse(vals[1]));
<a name="l00239"></a>00239                         <span class="keywordtype">string</span> symbol = vals[2];
<a name="l00240"></a>00240                         <span class="keywordtype">double</span> bid = a2f(vals[3]);
<a name="l00241"></a>00241                         <span class="keywordtype">double</span> ask = a2f(vals[4]);
<a name="l00242"></a>00242                         <span class="keywordtype">object</span>[] args = { ModuleName, symbol, time, bid, ask };
<a name="l00243"></a>00243                         ticksreceiver.Invoke(null, args);
<a name="l00244"></a>00244                     }
<a name="l00245"></a>00245                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onBar:&quot;</span>)
<a name="l00246"></a>00246                     {
<a name="l00247"></a>00247                         <span class="keywordtype">double</span> ttime = <span class="keywordtype">double</span>.Parse(vals[1]) / 1000;
<a name="l00248"></a>00248                         <span class="keywordtype">string</span> symbol = vals[2];
<a name="l00249"></a>00249                         <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a> tf = ms2tf(vals[3]);
<a name="l00250"></a>00250                         <span class="keywordtype">double</span>[] bar = { ttime, a2f(vals[4]), a2f(vals[5]), a2f(vals[6]), a2f(vals[7]) };
<a name="l00251"></a>00251                         <span class="keywordtype">object</span>[] args = { ModuleName, symbol, tf, bar, <span class="keyword">true</span> };
<a name="l00252"></a>00252                         barsreceiver.Invoke(null, args);
<a name="l00253"></a>00253                     }
<a name="l00254"></a>00254                     <span class="comment">//else if (vals[0] == &quot;&amp;onData:&quot;) //import data array</span>
<a name="l00255"></a>00255                     <span class="comment">//{</span>
<a name="l00256"></a>00256                     <span class="comment">//    string sym_tf = vals[2] + ms2tf(vals[3]).ToString();</span>
<a name="l00257"></a>00257                     <span class="comment">//    if ((gi[sym_tf] + 5) &lt;= quotes[sym_tf].Length)</span>
<a name="l00258"></a>00258                     <span class="comment">//    {</span>
<a name="l00259"></a>00259                     <span class="comment">//        quotes[sym_tf][gi[sym_tf]++] = double.Parse(vals[1]) / 1000; //c-style t_time</span>
<a name="l00260"></a>00260                     <span class="comment">//        quotes[sym_tf][gi[sym_tf]++] = a2f(vals[4]);</span>
<a name="l00261"></a>00261                     <span class="comment">//        quotes[sym_tf][gi[sym_tf]++] = a2f(vals[5]);</span>
<a name="l00262"></a>00262                     <span class="comment">//        quotes[sym_tf][gi[sym_tf]++] = a2f(vals[6]);</span>
<a name="l00263"></a>00263                     <span class="comment">//        quotes[sym_tf][gi[sym_tf]++] = a2f(vals[7]);</span>
<a name="l00264"></a>00264                     <span class="comment">//    }</span>
<a name="l00265"></a>00265                     <span class="comment">//}</span>
<a name="l00266"></a>00266                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onData:&quot;</span>) <span class="comment">//import data array // BID+ASK</span>
<a name="l00267"></a>00267                     {
<a name="l00268"></a>00268                         <span class="keywordtype">string</span> sym_tf = vals[2] + (int)ms2tf(vals[3]) + vals[9]; <span class="comment">//symbol.name + enum TF + BID/ASK</span>
<a name="l00269"></a>00269                         <span class="keywordflow">if</span> ((gi[sym_tf] + 5) &lt;= quotes[sym_tf].Length)
<a name="l00270"></a>00270                         {
<a name="l00271"></a>00271                             quotes[sym_tf][gi[sym_tf]++] = <span class="keywordtype">double</span>.Parse(vals[1]) / 1000; <span class="comment">//c-style t_time</span>
<a name="l00272"></a>00272                             quotes[sym_tf][gi[sym_tf]++] = a2f(vals[4]);
<a name="l00273"></a>00273                             quotes[sym_tf][gi[sym_tf]++] = a2f(vals[5]);
<a name="l00274"></a>00274                             quotes[sym_tf][gi[sym_tf]++] = a2f(vals[6]);
<a name="l00275"></a>00275                             quotes[sym_tf][gi[sym_tf]++] = a2f(vals[7]);
<a name="l00276"></a>00276                         }
<a name="l00277"></a>00277                     }
<a name="l00278"></a>00278                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onProgress:&quot;</span>) <span class="comment">//import data array</span>
<a name="l00279"></a>00279                     {
<a name="l00280"></a>00280                         <span class="keywordflow">if</span> (vals[1] == <span class="stringliteral">&quot;allDataLoaded&quot;</span>)
<a name="l00281"></a>00281                         {
<a name="l00282"></a>00282                             <span class="keywordtype">string</span> symbol = vals[4];
<a name="l00283"></a>00283                             <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a> tf = ms2tf(vals[5]);
<a name="l00284"></a>00284                             <span class="keywordtype">string</span> sym_tf = symbol + (int)tf;
<a name="l00285"></a>00285                             <span class="keywordflow">if</span> (++history_filled[sym_tf] == 2)
<a name="l00286"></a>00286                             {
<a name="l00287"></a>00287                                 <span class="comment">//count</span>
<a name="l00288"></a>00288                                 history_filled[sym_tf] = <span class="keywordtype">int</span>.Parse(vals[3]) / 2 * 5;
<a name="l00289"></a>00289                                 <span class="keywordflow">if</span>(vals[6]==<span class="stringliteral">&quot;async&quot;</span>){
<a name="l00290"></a>00290                                     <span class="keywordtype">double</span>[] bar = <span class="keyword">new</span> <span class="keywordtype">double</span>[5];
<a name="l00291"></a>00291                                     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>].Length; i += 5)
<a name="l00292"></a>00292                                     {
<a name="l00293"></a>00293                                         <span class="keywordflow">if</span>(isEmptyCandle(quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>], quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>], i)) <span class="keywordflow">continue</span>;
<a name="l00294"></a>00294 
<a name="l00295"></a>00295                                         bar[T] = quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>][i];
<a name="l00296"></a>00296                                         bar[O] = (quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>][i + O] + quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>][i + O]) / 2;
<a name="l00297"></a>00297                                         bar[H] = quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>][i + H];
<a name="l00298"></a>00298                                         bar[L] = quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>][i + L];
<a name="l00299"></a>00299                                         bar[C] = (quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>][i + C] + quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>][i + C]) / 2;
<a name="l00300"></a>00300 
<a name="l00301"></a>00301                                         <span class="keywordtype">object</span>[] args = { ModuleName, symbol, tf, bar, <span class="keyword">true</span> };
<a name="l00302"></a>00302                                         barsreceiver.Invoke(null, args);
<a name="l00303"></a>00303                                     }
<a name="l00304"></a>00304                                     <span class="comment">//Array.Resize(ref quotes[sym_tf + &quot;ASK&quot;], 0);</span>
<a name="l00305"></a>00305                                     this.quotes.Remove(sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>);
<a name="l00306"></a>00306                                     this.quotes.Remove(sym_tf + <span class="stringliteral">&quot;BID&quot;</span>);
<a name="l00307"></a>00307                                 }
<a name="l00308"></a>00308                             }
<a name="l00309"></a>00309                         }
<a name="l00310"></a>00310                     }
<a name="l00311"></a>00311                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onConnect:&quot;</span>)
<a name="l00312"></a>00312                     {
<a name="l00313"></a>00313                         connected = <span class="keyword">true</span>;
<a name="l00314"></a>00314                     }
<a name="l00315"></a>00315                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onDisconnect:&quot;</span>)
<a name="l00316"></a>00316                     {
<a name="l00317"></a>00317                         connected = <span class="keyword">false</span>;
<a name="l00318"></a>00318                     }
<a name="l00319"></a>00319                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;java.net.UnknownHostException:&quot;</span>) <span class="comment">// possiible bad internet connetcion or host address</span>
<a name="l00320"></a>00320                     {
<a name="l00321"></a>00321                         SendMessage(vals[0] + <span class="stringliteral">&quot;\nPossiible bad internet connetcion or host address: &quot;</span> + vals[1]);
<a name="l00322"></a>00322                     }
<a name="l00323"></a>00323                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;&amp;onConnectionFailed:&quot;</span>)
<a name="l00324"></a>00324                     {
<a name="l00325"></a>00325                         SendMessage(<span class="stringliteral">&quot;Connection Faild,\n please checkup your connection,\n login info, or try later&quot;</span>);
<a name="l00326"></a>00326                     }
<a name="l00327"></a>00327                     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vals[0] == <span class="stringliteral">&quot;JFHistory::onStop&quot;</span>)
<a name="l00328"></a>00328                     {
<a name="l00329"></a>00329                     }
<a name="l00330"></a>00330 
<a name="l00331"></a>00331                 }
<a name="l00332"></a>00332               <span class="comment">// if(dbg) SendMessage(&quot;End of input stream -- while ((input = JFClient_lst.StandardOutput.ReadLine()) != null)&quot;);</span>
<a name="l00334"></a>00334 <span class="comment"></span>                <span class="keywordflow">if</span> (JFClient_lst.HasExited &amp;&amp; JFClient_lst.ExitCode != 0 &amp;&amp; log.IndexOf(<span class="stringliteral">&quot;\n&quot;</span>) &gt; 0)
<a name="l00335"></a>00335                 {
<a name="l00336"></a>00336                     <span class="comment">//No Connection</span>
<a name="l00337"></a>00337                     <span class="keywordflow">if</span> (log.IndexOf(<span class="stringliteral">&quot;java.net.UnknownHostException:&quot;</span>) &gt; 0 &amp;&amp; log.IndexOf(<span class="stringliteral">&quot;(Unknown Source)&quot;</span>) &gt; 0 &amp;&amp; JFClient_lst.ExitCode == 2)
<a name="l00338"></a>00338                     {
<a name="l00339"></a>00339                         <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="stringliteral">&quot;No internet connection&quot;</span>);
<a name="l00340"></a>00340                         <span class="comment">//SendMessage(&quot;No internet connection&quot;);</span>
<a name="l00341"></a>00341                     }
<a name="l00342"></a>00342                     <span class="keywordflow">else</span>
<a name="l00343"></a>00343                     {
<a name="l00344"></a>00344                         log += <span class="stringliteral">&quot;\n JFClient exited with code &quot;</span> + JFClient_lst.ExitCode;
<a name="l00345"></a>00345                         SendMessage(log);
<a name="l00346"></a>00346                     }
<a name="l00347"></a>00347                 }
<a name="l00348"></a>00348                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (JFClient_lst.HasExited &amp;&amp; JFClient_lst.ExitCode != 0) SendMessage(JFClient_lst.ExitCode);
<a name="l00349"></a>00349             }
<a name="l00350"></a>00350         }
<a name="l00351"></a>00351         <span class="keywordtype">bool</span> isEmptyCandle(<span class="keywordtype">double</span>[] BID, <span class="keywordtype">double</span>[] ASK, <span class="keywordtype">int</span> i)
<a name="l00352"></a>00352         {
<a name="l00353"></a>00353            <span class="keywordflow">return</span> (BID[i + O] == BID[i + H]
<a name="l00354"></a>00354                 &amp;&amp; BID[i + O] == BID[i + C]
<a name="l00355"></a>00355                 &amp;&amp; BID[i + O] == BID[i + L]
<a name="l00356"></a>00356                 &amp;&amp; ASK[i + O] == ASK[i + H]
<a name="l00357"></a>00357                 &amp;&amp; ASK[i + O] == ASK[i + C]
<a name="l00358"></a>00358                 &amp;&amp; ASK[i + O] == ASK[i + L]);
<a name="l00359"></a>00359         }
<a name="l00360"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#ac41442672be00c3354a92275ebae54c2">00360</a>         <span class="keyword">public</span> <span class="keywordtype">void</span> RemTickHandler(<span class="keywordtype">string</span> sym)
<a name="l00361"></a>00361         {
<a name="l00362"></a>00362             <span class="keywordflow">if</span> (bglistener != null &amp;&amp; JFClient_lst != null &amp;&amp; !JFClient_lst.HasExited)
<a name="l00363"></a>00363             {
<a name="l00364"></a>00364                 JFClient_lst.StandardInput.WriteLine(<span class="stringliteral">&quot;remove_symbol &quot;</span> + sym);
<a name="l00365"></a>00365                 <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="stringliteral">&quot;Send: remove_symbol &quot;</span> + sym);
<a name="l00366"></a>00366             }
<a name="l00367"></a>00367         }
<a name="l00368"></a>00368         <span class="comment">//-------------------------------------//</span>
<a name="l00369"></a>00369         <span class="keywordtype">void</span> ticks_listener_completed(<span class="keywordtype">object</span> sender, RunWorkerCompletedEventArgs e)
<a name="l00370"></a>00370         {
<a name="l00371"></a>00371             <span class="keywordflow">if</span> (bglistener != null)
<a name="l00372"></a>00372             {
<a name="l00373"></a>00373                 bglistener.Dispose();
<a name="l00374"></a>00374                 bglistener = null;
<a name="l00375"></a>00375             }
<a name="l00376"></a>00376         }
<a name="l00377"></a>00377 
<a name="l00378"></a>00378         <span class="comment">//-------------------------------------//</span>
<a name="l00379"></a>00379         <span class="keyword">const</span> <span class="keywordtype">long</span> m60  = 60 * 60 * 1000,
<a name="l00380"></a>00380                    m240 = 240 * 60 * 1000,
<a name="l00381"></a>00381                    day  = 24 * 60 * 60 * 1000,
<a name="l00382"></a>00382                    week = 7 * 24 * 60 * 60 * 1000,
<a name="l00383"></a>00383                    month= 30L * 24 * 60 * 60 * 1000,
<a name="l00384"></a>00384                    year = 365240L * 24 * 60 * 60;
<a name="l00385"></a>00385 
<a name="l00386"></a>00386         <span class="comment">//-------------------------------------//</span>
<a name="l00387"></a>00387         <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a> ms2tf(<span class="keywordtype">string</span> msec)
<a name="l00388"></a>00388         {
<a name="l00389"></a>00389             <span class="keywordflow">switch</span> (<span class="keywordtype">long</span>.Parse(msec))
<a name="l00390"></a>00390             {
<a name="l00391"></a>00391                 <span class="keywordflow">case</span> m60: <span class="keywordflow">return</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.m60;
<a name="l00392"></a>00392                 <span class="keywordflow">case</span> m240: <span class="keywordflow">return</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.m240;
<a name="l00393"></a>00393                 <span class="keywordflow">case</span> day: <span class="keywordflow">return</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.Day;
<a name="l00394"></a>00394                 <span class="keywordflow">case</span> week: <span class="keywordflow">return</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.Week;
<a name="l00395"></a>00395                 <span class="keywordflow">case</span> year: <span class="keywordflow">return</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.Year;
<a name="l00396"></a>00396                 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.custom;
<a name="l00397"></a>00397             }
<a name="l00398"></a>00398         }
<a name="l00399"></a>00399 
<a name="l00400"></a>00400         <span class="comment">//-------------------------------------//</span>
<a name="l00401"></a>00401         <span class="keywordtype">long</span> tf2ms(<a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a> tf)
<a name="l00402"></a>00402         {
<a name="l00403"></a>00403             <span class="keywordflow">switch</span> (tf)
<a name="l00404"></a>00404             {
<a name="l00405"></a>00405                 <span class="keywordflow">case</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.m60: <span class="keywordflow">return</span> m60;
<a name="l00406"></a>00406                 <span class="keywordflow">case</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.m240: <span class="keywordflow">return</span> m240;
<a name="l00407"></a>00407                 <span class="keywordflow">case</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.Day: <span class="keywordflow">return</span> day;
<a name="l00408"></a>00408                 <span class="keywordflow">case</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.Week: <span class="keywordflow">return</span> week;
<a name="l00409"></a>00409                 <span class="keywordflow">case</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>.Year: <span class="keywordflow">return</span> year;
<a name="l00410"></a>00410                 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1;
<a name="l00411"></a>00411             }
<a name="l00412"></a>00412         }
<a name="l00413"></a>00413 
<a name="l00414"></a>00414         <span class="comment">//-------------------------------------//</span>
<a name="l00415"></a>00415         <span class="keywordtype">double</span> s2dtime(<span class="keywordtype">string</span> stime)
<a name="l00416"></a>00416         {
<a name="l00417"></a>00417             DateTime cdate = DateTime.Parse(stime);
<a name="l00418"></a>00418             DateTime nuldate = <span class="keyword">new</span> DateTime(1970, 01, 01);
<a name="l00419"></a>00419             TimeSpan ts = cdate - nuldate;
<a name="l00420"></a>00420             <span class="keywordflow">return</span> ts.TotalSeconds;
<a name="l00421"></a>00421         }
<a name="l00422"></a>00422 
<a name="l00423"></a>00423         <span class="keywordtype">int</span> taillen(<span class="keywordtype">long</span> starttime, <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a> tf)
<a name="l00424"></a>00424         {
<a name="l00425"></a>00425             DateTime nuldate = <span class="keyword">new</span> DateTime(1970, 01, 01);
<a name="l00426"></a>00426             TimeSpan ts = DateTime.Now - nuldate;
<a name="l00427"></a>00427             <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)((ts.TotalMilliseconds - starttime) / tf2ms(tf));
<a name="l00428"></a>00428         }
<a name="l00429"></a>00429 
<a name="l00430"></a>00430         <span class="comment">//-------------------------------------//</span>
<a name="l00431"></a>00431         <span class="keywordtype">void</span> SendMessage(System.Diagnostics.Process JFClient)
<a name="l00432"></a>00432         {
<a name="l00433"></a>00433             <span class="keywordtype">string</span> line, text = <span class="stringliteral">&quot;Connection failed (with exit code &quot;</span> + JFClient.ExitCode + <span class="stringliteral">&quot;)&quot;</span>;
<a name="l00434"></a>00434             <span class="keywordflow">while</span> ((line = JFClient.StandardOutput.ReadLine()) != null) text += <span class="stringliteral">&quot;\n&quot;</span> + line;
<a name="l00435"></a>00435             SendMessage(text);
<a name="l00436"></a>00436         }
<a name="l00437"></a>00437 
<a name="l00438"></a>00438         <span class="comment">//-------------------------------------//</span>
<a name="l00439"></a>00439         <span class="keywordtype">void</span> SendMessage(<span class="keywordtype">string</span> message)
<a name="l00440"></a>00440         {
<a name="l00441"></a>00441             <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="keywordtype">string</span>.Format(<span class="stringliteral">&quot;{0:yyyy-MM-dd HH:mm:ss.fff}: {1}&quot;</span>, DateTime.Now, <span class="stringliteral">&quot;SM: &quot;</span> + message));
<a name="l00442"></a>00442             <span class="keywordflow">if</span> (libmsgreceiver != null)
<a name="l00443"></a>00443             {
<a name="l00444"></a>00444                 <span class="keywordtype">string</span> symbol = null;
<a name="l00445"></a>00445                 <span class="keywordtype">int</span> code = 0;
<a name="l00446"></a>00446                 <span class="keywordtype">object</span>[] args = { ModuleName, symbol, code, message };
<a name="l00447"></a>00447                 libmsgreceiver.Invoke(null, args);
<a name="l00448"></a>00448             }
<a name="l00449"></a>00449         }
<a name="l00450"></a>00450 
<a name="l00451"></a>00451         <span class="comment">//-------------------------------------//</span>
<a name="l00452"></a>00452         <span class="keywordtype">void</span> SendMessage(<span class="keywordtype">int</span> code)
<a name="l00453"></a>00453         {
<a name="l00454"></a>00454             <span class="keywordflow">if</span> (libmsgreceiver != null)
<a name="l00455"></a>00455             {
<a name="l00456"></a>00456                 <span class="keywordtype">string</span> message = null;
<a name="l00457"></a>00457                 <span class="keywordflow">switch</span> (code)
<a name="l00458"></a>00458                 {
<a name="l00459"></a>00459                     <span class="keywordflow">case</span> 0: <span class="keywordflow">return</span>;
<a name="l00460"></a>00460                     <span class="keywordflow">case</span> 1: <span class="comment">//&quot;Failed to connect Dukascopy servers&quot;</span>
<a name="l00461"></a>00461                         message = <span class="stringliteral">&quot;Failed to connect Dukascopy servers\nPlease check your network connetctions&quot;</span>;
<a name="l00462"></a>00462                         <span class="keywordflow">break</span>;
<a name="l00463"></a>00463                     <span class="keywordflow">case</span> 2: <span class="comment">//&quot;Failed to login&quot;</span>
<a name="l00464"></a>00464                         message = <span class="stringliteral">&quot;Login failed, please check your login informations&quot;</span>;
<a name="l00465"></a>00465                         <span class="keywordflow">break</span>;
<a name="l00466"></a>00466                 }
<a name="l00467"></a>00467                 SendMessage(message);
<a name="l00468"></a>00468             }
<a name="l00469"></a>00469         }
<a name="l00470"></a>00470 
<a name="l00471"></a>00471         <span class="comment">//-------------------------------------//</span>
<a name="l00472"></a>00472         <span class="keyword">static</span> Dictionary&lt;string, string&gt; last_time = <span class="keyword">new</span> Dictionary&lt;string, string&gt;();
<a name="l00473"></a>00473         <span class="keyword">static</span> Dictionary&lt;string, string&gt; last_tick = <span class="keyword">new</span> Dictionary&lt;string, string&gt;();
<a name="l00474"></a>00474         <span class="keyword">enum</span> <a class="code" href="namespacertservice.html#aba4d693ff4feace372fd12fcec2bda3b">TF</a>{
<a name="l00475"></a>00475             m60, m240, Day, Week, Month, Quarter, Year, <span class="comment">//набор базовых фреймов</span>
<a name="l00476"></a>00476             count,                                      <span class="comment">//указатель ёмкости для массивов</span>
<a name="l00477"></a>00477             AllSeparate, AllSingle,                     <span class="comment">//наряду с базовыми флаги выбора чарта для одного симовола или набора в одном или в семи разных окнах</span>
<a name="l00478"></a>00478             custom                                      <span class="comment">//все неперечисленные тут периоды рассматриваем как определенные пользователем</span>
<a name="l00479"></a>00479         };
<a name="l00480"></a>00480 
<a name="l00481"></a>00481         <span class="comment">//-------------------------------------//</span>
<a name="l00482"></a>00482         <span class="keywordtype">long</span> Now()
<a name="l00483"></a>00483         {
<a name="l00484"></a>00484             DateTime nuldate = <span class="keyword">new</span> DateTime(1970, 01, 01);
<a name="l00485"></a>00485             TimeSpan ts = DateTime.Now - nuldate;
<a name="l00486"></a>00486             <span class="keywordflow">return</span> (<span class="keywordtype">long</span>)ts.TotalMilliseconds;
<a name="l00487"></a>00487         }
<a name="l00488"></a>00488 
<a name="l00489"></a>00489         <span class="comment">//-------------------------------------//</span>
<a name="l00490"></a>00490         <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_HISTORY_LENGTH =200;
<a name="l00491"></a>00491         <span class="keywordtype">int</span> current_frame;
<a name="l00492"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a02856ca195317c78695decd5ca1eff3b">00492</a>         <span class="keyword">public</span> <span class="keywordtype">void</span> <span class="keyword">import</span>(<span class="keywordtype">string</span> symbol_name, <span class="keywordtype">int</span> tf, <span class="keywordtype">int</span> shift, <span class="keywordtype">int</span>[] _len, <span class="keywordtype">double</span>[] quotes)
<a name="l00493"></a>00493         {
<a name="l00494"></a>00494             <span class="keywordtype">int</span> len = _len[0];
<a name="l00495"></a>00495             <span class="keywordtype">string</span>[] param = folder_path.Split(<span class="charliteral">&#39;,&#39;</span>);
<a name="l00496"></a>00496             <span class="keywordtype">char</span> delim = <span class="charliteral">&#39;=&#39;</span>;
<a name="l00497"></a>00497             <span class="keywordtype">string</span> server_url = param[0].Substring(param[0].IndexOf(delim)+1);
<a name="l00498"></a>00498             <span class="keywordtype">string</span> login = param[1].Substring(param[1].IndexOf(delim)+1);
<a name="l00499"></a>00499             <span class="keywordtype">string</span> password = param[2].Substring(param[2].IndexOf(delim)+1);
<a name="l00500"></a>00500             <span class="keywordtype">string</span> log=<span class="stringliteral">&quot;import &quot;</span> + symbol_name;
<a name="l00501"></a>00501             <span class="keywordtype">string</span> sym_tf = symbol_name + tf.ToString();
<a name="l00502"></a>00502             gi[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>] = gi[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>] = 0;
<a name="l00503"></a>00503             history_filled[sym_tf] = 0;
<a name="l00504"></a>00504             <span class="comment">//shift can be used as a startdate or shift from begin of available hostory data</span>
<a name="l00505"></a>00505             <span class="keywordtype">long</span> startdate = 0;
<a name="l00506"></a>00506             <span class="keywordtype">int</span> quotes_length = 0;
<a name="l00507"></a>00507             <span class="keywordtype">string</span> mode = quotes.Length == 0 ? <span class="stringliteral">&quot;async&quot;</span> : <span class="stringliteral">&quot;sync&quot;</span>;
<a name="l00508"></a>00508             <span class="keywordflow">if</span> (shift &gt; 10000000)
<a name="l00509"></a>00509             {
<a name="l00510"></a>00510                 startdate = shift * 1000L;
<a name="l00511"></a>00511                 shift = 0;
<a name="l00512"></a>00512                 mode = <span class="stringliteral">&quot;async&quot;</span>;
<a name="l00513"></a>00513 
<a name="l00514"></a>00514                 quotes_length = 5 * (taillen(startdate, (TF)tf) + 10); <span class="comment">//длинна хвоста для докачки +10 баров ну случай слабой связи</span>
<a name="l00515"></a>00515                 <span class="keywordflow">if</span>(quotes.Length &gt; 0) Array.Resize(ref quotes, 0);
<a name="l00516"></a>00516             }
<a name="l00517"></a>00517 
<a name="l00518"></a>00518             <span class="keywordflow">if</span> (startdate == 0 &amp;&amp; len == 0) len = DEFAULT_HISTORY_LENGTH;
<a name="l00519"></a>00519             <span class="keywordflow">if</span> (mode == <span class="stringliteral">&quot;async&quot;</span>)
<a name="l00520"></a>00520             {
<a name="l00521"></a>00521                 this.quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>] = <span class="keyword">new</span> <span class="keywordtype">double</span>[quotes_length];
<a name="l00522"></a>00522             }
<a name="l00523"></a>00523             <span class="keywordflow">else</span>
<a name="l00524"></a>00524             {
<a name="l00525"></a>00525                 this.quotes[sym_tf + <span class="stringliteral">&quot;BID&quot;</span>] = quotes;
<a name="l00526"></a>00526                 quotes_length = quotes.Length;
<a name="l00527"></a>00527             }
<a name="l00528"></a>00528             this.quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>] = <span class="keyword">new</span> <span class="keywordtype">double</span>[quotes_length];
<a name="l00529"></a>00529 
<a name="l00530"></a>00530 
<a name="l00531"></a>00531             <span class="keywordflow">if</span> (JFClient_lst == null || JFClient_lst.HasExited)
<a name="l00532"></a>00532             {
<a name="l00533"></a>00533                 current_frame = tf;
<a name="l00534"></a>00534                 SetTickHandler(symbol_name);
<a name="l00535"></a>00535             }
<a name="l00536"></a>00536             
<a name="l00537"></a>00537             <span class="keywordtype">int</span> cnt = 50; <span class="comment">//wait 5 secoonds</span>
<a name="l00538"></a>00538             <span class="keywordflow">while</span> (!connected &amp;&amp; (cnt-- &gt; 0)) Thread.Sleep(100);
<a name="l00539"></a>00539             <span class="keywordflow">if</span> (!connected)
<a name="l00540"></a>00540             {
<a name="l00541"></a>00541                 <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="keywordtype">string</span>.Format(<span class="stringliteral">&quot;{0:yyyy-MM-dd HH:mm:ss.fff}: {1}&quot;</span>, DateTime.Now, <span class="stringliteral">&quot;import: !connected&quot;</span>));
<a name="l00542"></a>00542                 <span class="comment">//return;</span>
<a name="l00543"></a>00543             }
<a name="l00544"></a>00544 
<a name="l00545"></a>00545             <span class="keywordflow">if</span> (JFClient_lst == null)
<a name="l00546"></a>00546             {
<a name="l00547"></a>00547                 <span class="comment">//SendMessage(&quot;import: JFClient_lst == null&quot;);</span>
<a name="l00548"></a>00548                 <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="stringliteral">&quot;import: JFClient_lst == null&quot;</span>);
<a name="l00549"></a>00549                 <span class="keywordflow">return</span>;
<a name="l00550"></a>00550             }
<a name="l00551"></a>00551             <span class="keywordflow">if</span> (JFClient_lst.HasExited)
<a name="l00552"></a>00552             {
<a name="l00553"></a>00553                 <span class="comment">//SendMessage(&quot;import: JFClient_lst.HasExited, return&quot;);</span>
<a name="l00554"></a>00554                 <span class="comment">//SendMessage(JFClient_lst);</span>
<a name="l00555"></a>00555                 <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="stringliteral">&quot;import: JFClient_lst.HasExited, return&quot;</span>);
<a name="l00556"></a>00556                 <span class="keywordflow">return</span>;
<a name="l00557"></a>00557             }
<a name="l00558"></a>00558 
<a name="l00559"></a>00559             <span class="comment">//request the history//</span>
<a name="l00560"></a>00560             <span class="keywordtype">string</span> request = <span class="stringliteral">&quot;get_history &quot;</span>
<a name="l00561"></a>00561                 + symbol_name + <span class="stringliteral">&quot; &quot;</span>
<a name="l00562"></a>00562                 + tf2ms((TF)tf) + <span class="stringliteral">&quot; &quot;</span>
<a name="l00563"></a>00563                 + len +<span class="stringliteral">&quot; &quot;</span>
<a name="l00564"></a>00564                 + startdate + <span class="stringliteral">&quot; &quot;</span>
<a name="l00565"></a>00565                 + Now();
<a name="l00566"></a>00566 
<a name="l00567"></a>00567             <span class="keywordflow">try</span>
<a name="l00568"></a>00568             {
<a name="l00569"></a>00569                 JFClient_lst.StandardInput.WriteLine(request);
<a name="l00570"></a>00570                 <span class="keywordflow">if</span> (dbg) sw.WriteLine(<span class="stringliteral">&quot;Send: &quot;</span> + request);
<a name="l00571"></a>00571             }
<a name="l00572"></a>00572             <span class="keywordflow">catch</span> (Exception e)
<a name="l00573"></a>00573             {
<a name="l00574"></a>00574                 SendMessage(<span class="stringliteral">&quot;can`t send get_history: JFClient_lst.StandardInput.WriteLine(request);&quot;</span> + e.Message);
<a name="l00575"></a>00575             }
<a name="l00576"></a>00576             
<a name="l00577"></a>00577             <span class="comment">//wait for load</span>
<a name="l00578"></a>00578             <span class="keywordflow">if</span> (mode == <span class="stringliteral">&quot;sync&quot;</span>){
<a name="l00579"></a>00579                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 6000; i++) <span class="comment">//wait 30 seconds</span>
<a name="l00580"></a>00580                     <span class="keywordflow">if</span> (history_filled[sym_tf] &lt; 2 &amp;&amp; !JFClient_lst.HasExited) Thread.Sleep(100); <span class="comment">//needs for use local cash</span>
<a name="l00581"></a>00581                     <span class="keywordflow">else</span> <span class="keywordflow">break</span>;
<a name="l00583"></a>00583                 <span class="keywordflow">if</span> (history_filled[sym_tf] &gt;= 2)
<a name="l00584"></a>00584                 {
<a name="l00585"></a>00585                     <span class="keywordtype">int</span> j = 0;
<a name="l00586"></a>00586                     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; quotes.Length<span class="comment">/*history_filled[sym_tf]*/</span>; i += 5)
<a name="l00587"></a>00587                     {
<a name="l00588"></a>00588                         <span class="keywordflow">if</span> (isEmptyCandle(quotes, this.quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>], i)) <span class="keywordflow">continue</span>;
<a name="l00589"></a>00589                         quotes[j + T] = quotes[i + T];
<a name="l00590"></a>00590                         quotes[j + O] = (this.quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>][i + O] + quotes[i + O]) / 2;
<a name="l00591"></a>00591                         quotes[j + H] = this.quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>][i + H];
<a name="l00592"></a>00592                         quotes[j + L] = quotes[i + L];
<a name="l00593"></a>00593                         quotes[j + C] = (this.quotes[sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>][i + C] + quotes[i + C]) / 2;
<a name="l00594"></a>00594                         j+=5;
<a name="l00595"></a>00595                     }
<a name="l00596"></a>00596                     <span class="comment">//Array.Resize(ref quotes, j); //совершенно без толку т.к. изменяется лишь атрибут длинны для данного указателя</span>
<a name="l00597"></a>00597                     _len[0] = j/5;
<a name="l00598"></a>00598                 }
<a name="l00599"></a>00599                 this.quotes.Remove(sym_tf + <span class="stringliteral">&quot;ASK&quot;</span>);
<a name="l00600"></a>00600             }
<a name="l00601"></a>00601 
<a name="l00602"></a>00602             <span class="keywordflow">if</span> (JFClient_lst.HasExited &amp;&amp; JFClient_lst.ExitCode != 0 &amp;&amp; log.IndexOf(<span class="stringliteral">&quot;\n&quot;</span>) &gt; 0)
<a name="l00603"></a>00603             {
<a name="l00604"></a>00604                 log += <span class="stringliteral">&quot;\n JFClient exited with code &quot;</span> + JFClient_lst.ExitCode;
<a name="l00605"></a>00605                 SendMessage(log);
<a name="l00606"></a>00606             }
<a name="l00607"></a>00607             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (JFClient_lst.HasExited &amp;&amp; JFClient_lst.ExitCode != 0) SendMessage(JFClient_lst.ExitCode);
<a name="l00608"></a>00608         }
<a name="l00610"></a>00610 
<a name="l00611"></a>00611         <span class="keyword">static</span> <span class="keywordtype">void</span> strcpy(<span class="keywordtype">string</span> s, <span class="keywordtype">char</span>[] d)
<a name="l00612"></a>00612         {
<a name="l00613"></a>00613             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; s.Length; i++)
<a name="l00614"></a>00614             {
<a name="l00615"></a>00615                 d[i] = s[i];
<a name="l00616"></a>00616             }
<a name="l00617"></a>00617             d[s.Length] = <span class="charliteral">&#39;\0&#39;</span>;
<a name="l00618"></a>00618         }
<a name="l00619"></a>00619 
<a name="l00620"></a>00620         <span class="comment">//get list of symbol name, his period and length of quote_arrays for each symbol</span>
<a name="l00621"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a9bc03133f84d558ccc68194b1b0645c9">00621</a>         <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> get_symbol_list(<span class="keywordtype">string</span>[] symbols, <span class="keywordtype">int</span>[] period, <span class="keywordtype">int</span>[] len)
<a name="l00622"></a>00622         {
<a name="l00623"></a>00623             <span class="keywordtype">int</span> i = 0;
<a name="l00624"></a>00624             symbols[i++] = <span class="stringliteral">&quot;AUDJPY&quot;</span>;
<a name="l00625"></a>00625             symbols[i++] = <span class="stringliteral">&quot;AUDNZD&quot;</span>;
<a name="l00626"></a>00626             symbols[i++] = <span class="stringliteral">&quot;AUDUSD&quot;</span>;
<a name="l00627"></a>00627             symbols[i++] = <span class="stringliteral">&quot;CADJPY&quot;</span>;
<a name="l00628"></a>00628             symbols[i++] = <span class="stringliteral">&quot;CHFJPY&quot;</span>;
<a name="l00629"></a>00629             symbols[i++] = <span class="stringliteral">&quot;EURAUD&quot;</span>;
<a name="l00630"></a>00630             symbols[i++] = <span class="stringliteral">&quot;EURCAD&quot;</span>;
<a name="l00631"></a>00631             symbols[i++] = <span class="stringliteral">&quot;EURCHF&quot;</span>;
<a name="l00632"></a>00632             symbols[i++] = <span class="stringliteral">&quot;EURDKK&quot;</span>;
<a name="l00633"></a>00633             symbols[i++] = <span class="stringliteral">&quot;EURGBP&quot;</span>;
<a name="l00634"></a>00634             symbols[i++] = <span class="stringliteral">&quot;EURHKD&quot;</span>;
<a name="l00635"></a>00635             symbols[i++] = <span class="stringliteral">&quot;EURJPY&quot;</span>;
<a name="l00636"></a>00636             symbols[i++] = <span class="stringliteral">&quot;EURNOK&quot;</span>;
<a name="l00637"></a>00637             symbols[i++] = <span class="stringliteral">&quot;EURSEK&quot;</span>;
<a name="l00638"></a>00638             symbols[i++] = <span class="stringliteral">&quot;EURUSD&quot;</span>;
<a name="l00639"></a>00639             symbols[i++] = <span class="stringliteral">&quot;GBPCHF&quot;</span>;
<a name="l00640"></a>00640             symbols[i++] = <span class="stringliteral">&quot;GBPJPY&quot;</span>;
<a name="l00641"></a>00641             symbols[i++] = <span class="stringliteral">&quot;GBPUSD&quot;</span>;
<a name="l00642"></a>00642             symbols[i++] = <span class="stringliteral">&quot;NZDUSD&quot;</span>;
<a name="l00643"></a>00643             symbols[i++] = <span class="stringliteral">&quot;USDCAD&quot;</span>;
<a name="l00644"></a>00644             symbols[i++] = <span class="stringliteral">&quot;USDCHF&quot;</span>;
<a name="l00645"></a>00645             symbols[i++] = <span class="stringliteral">&quot;USDDKK&quot;</span>;
<a name="l00646"></a>00646             symbols[i++] = <span class="stringliteral">&quot;USDHKD&quot;</span>;
<a name="l00647"></a>00647             symbols[i++] = <span class="stringliteral">&quot;USDJPY&quot;</span>;
<a name="l00648"></a>00648             symbols[i++] = <span class="stringliteral">&quot;USDMXN&quot;</span>;
<a name="l00649"></a>00649             symbols[i++] = <span class="stringliteral">&quot;USDNOK&quot;</span>;
<a name="l00650"></a>00650             symbols[i++] = <span class="stringliteral">&quot;USDSEK&quot;</span>;
<a name="l00651"></a>00651             symbols[i++] = <span class="stringliteral">&quot;USDSGD&quot;</span>;
<a name="l00652"></a>00652             symbols[i++] = <span class="stringliteral">&quot;USDTRY&quot;</span>;
<a name="l00653"></a>00653 
<a name="l00654"></a>00654             <span class="keywordtype">int</span> _period = 60; <span class="comment">// int.Parse(param[1].Substring(param[1].IndexOf(delim) + 1));</span>
<a name="l00655"></a>00655             <span class="keywordflow">for</span> (i = 0; i &lt; symbols.Length; i++)
<a name="l00656"></a>00656             {
<a name="l00657"></a>00657                 len[i] = 0; <span class="comment">//100 is random number</span>
<a name="l00658"></a>00658                 period[i] = _period;
<a name="l00659"></a>00659             }
<a name="l00660"></a>00660         }
<a name="l00661"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#aa31f28cf49c2418aab11f0bd84e3bb7d">00661</a>         <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> get_history_length(<span class="keywordtype">string</span> symbol, <span class="keywordtype">int</span> period, <span class="keywordtype">int</span>[] len)
<a name="l00662"></a>00662         {
<a name="l00663"></a>00663             <span class="keywordflow">if</span> (len[0] &lt;= 0) len[0] = DEFAULT_HISTORY_LENGTH;
<a name="l00664"></a>00664         }
<a name="l00665"></a>00665 
<a name="l00666"></a>00666         <span class="keyword">const</span> <span class="keywordtype">int</span> forexsymbolcount = 29;
<a name="l00667"></a>00667         <span class="comment">//get count of existing symbols</span>
<a name="l00668"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#ad36947c1e86ea892f312d0c89f3eb56b">00668</a>         <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> get_symbol_count(<span class="keywordtype">string</span> folderpath, <span class="keywordtype">int</span>[] count)
<a name="l00669"></a>00669         {
<a name="l00670"></a>00670             folder_path = folderpath;
<a name="l00671"></a>00671             count[0] = forexsymbolcount;
<a name="l00672"></a>00672         }
<a name="l00673"></a>00673 
<a name="l00674"></a>00674         <span class="comment">//следующие 2 метода могут вызываться менеджером данных с определенным интервалом</span>
<a name="l00675"></a>00675         <span class="comment">//double[] tick == tick[0]=bid, tick[1]=ask, tick[2]=time(day.miliseconds)</span>
<a name="l00676"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#ab1d292580136d90455f3d43edfd81d52">00676</a>         <span class="keyword">public</span> <span class="keywordtype">void</span> get_tick(<span class="keywordtype">string</span> sym, <span class="keywordtype">double</span>[] tick)
<a name="l00677"></a>00677         {
<a name="l00678"></a>00678         }
<a name="l00679"></a>00679 
<a name="l00680"></a>00680         <span class="comment">//вход: если bar[0] не пустой - то должен хранить время последнего полученного бара</span>
<a name="l00681"></a>00681         <span class="comment">//если пустой то фонкция возвращает последний известный бар.</span>
<a name="l00682"></a><a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html#a920f782aff7e178695b8e909ba901256">00682</a>         <span class="keyword">public</span> <span class="keywordtype">void</span> get_bar(<span class="keywordtype">string</span> sym, <span class="keywordtype">int</span> period, DateTime lastTime, <span class="keywordtype">int</span> lastPosition)
<a name="l00683"></a>00683         {
<a name="l00684"></a>00684         }
<a name="l00685"></a>00685 
<a name="l00686"></a>00686         ~<a class="code" href="class_skilful_1_1_data_1_1_data_source_class.html">DataSourceClass</a>()
<a name="l00687"></a>00687         {
<a name="l00688"></a>00688             <span class="keywordflow">if</span> (JFClient_lst != null &amp;&amp; !JFClient_lst.HasExited)
<a name="l00689"></a>00689             {
<a name="l00690"></a>00690                 JFClient_lst.Kill();
<a name="l00691"></a>00691                 JFClient_lst.WaitForExit();
<a name="l00692"></a>00692             }
<a name="l00693"></a>00693             <span class="keywordflow">if</span> (bglistener != null) bglistener.CancelAsync();
<a name="l00694"></a>00694             <span class="keywordflow">if</span> (dbg) <span class="keywordflow">try</span> { sw.Close(); } <span class="keywordflow">catch</span> { }
<a name="l00695"></a>00695         }
<a name="l00696"></a>00696     }
<a name="l00697"></a>00697 }
</pre></div></div>
</div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&nbsp;</span>Указатель</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&nbsp;</span>Классы</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&nbsp;</span>Пространства имен</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&nbsp;</span>Файлы</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&nbsp;</span>Функции</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&nbsp;</span>Переменные</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&nbsp;</span>Перечисления</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&nbsp;</span>Свойства</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&nbsp;</span>События</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<hr class="footer"/><address class="footer"><small>Создано системой&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
</body>
</html>
